#include "oledfront.h"
/*------左面四个io----------*/
int OLED_SCL     = 16; 
int OLED_SDIN   = 14;

#define  u8 unsigned char 
#define  u32 unsigned int 
#define OLED_CMD  0  //写命令
#define OLED_DATA 1 //写数据
#define OLED_MODE 0

#define OLED_SCLK_Clr() digitalWrite(OLED_SCL,0)
#define OLED_SCLK_Set() digitalWrite(OLED_SCL,1)
#define OLED_SDIN_Clr() digitalWrite(OLED_SDIN,0)
#define OLED_SDIN_Set() digitalWrite(OLED_SDIN,1)
#define SIZE 16
#define XLevelL   0x02
#define XLevelH   0x10
#define Max_Column  128
#define Max_Row   64
#define Brightness  0xFF 
#define X_WIDTH   128
#define Y_WIDTH   64


/**********************************************
//IIC Start
**********************************************/
void IIC_Start()
{

  OLED_SCLK_Set();
  OLED_SDIN_Set();
  OLED_SDIN_Clr();
  OLED_SCLK_Clr();
}

/**********************************************
//IIC Stop
**********************************************/
void IIC_Stop()
{
    OLED_SCLK_Set() ;
  OLED_SDIN_Clr();
  OLED_SDIN_Set();  
}

void IIC_Wait_Ack()
{
  OLED_SCLK_Set() ;
  OLED_SCLK_Clr();
}
/**********************************************
// IIC Write byte
**********************************************/
void Write_IIC_Byte(unsigned char IIC_Byte)
{
  unsigned char i=0;
  unsigned char m=0,da=0;
  da=IIC_Byte;
  OLED_SCLK_Clr();
  for(i=0;i<8;i++)    
  {
      m=da;
    m=m&0x80;
    if(m==0x80)
    {OLED_SDIN_Set();}
    else OLED_SDIN_Clr();
      da=da<<1;
    OLED_SCLK_Set();
    OLED_SCLK_Clr();
    }
}
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
   IIC_Start();
   Write_IIC_Byte(0x78);            //Slave address,SA0=0
  IIC_Wait_Ack(); 
   Write_IIC_Byte(0x00);      //write command
  IIC_Wait_Ack(); 
   Write_IIC_Byte(IIC_Command); 
  IIC_Wait_Ack(); 
   IIC_Stop();
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
   IIC_Start();
   Write_IIC_Byte(0x78);      //D/C#=0; R/W#=0
  IIC_Wait_Ack(); 
   Write_IIC_Byte(0x40);      //write data
  IIC_Wait_Ack(); 
   Write_IIC_Byte(IIC_Data);
  IIC_Wait_Ack(); 
   IIC_Stop();
}
void OLED_WR_Byte(unsigned dat,unsigned cmd)
{
  if(cmd)
      {

   Write_IIC_Data(dat);
   
    }
  else {
   Write_IIC_Command(dat);
    
  }


}


//坐标设置

  void OLED_Set_Pos(unsigned char x, unsigned char y) 
{   OLED_WR_Byte(0xb0+y,OLED_CMD);                            //页坐标
  OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);        //列坐标高四位
  OLED_WR_Byte((x&0x0f),OLED_CMD);                          //列坐标低四位
}       
//开启OLED显示    
void OLED_Display_On(void)
{
  OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令 <---> 电荷泵
  OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON         <--->打开电荷泵
  OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON     <--->开显示
}          
//清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!   
void OLED_Clear(void)  
{  
  u8 i,n;       
  for(i=0;i<8;i++)  
  {  
    OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址（0~7）
    OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
    OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
    for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 
  } 
}
//在指定位置显示一个字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白显示;1,正常显示         
//字体 8*16
void OLED_ShowChar(u8 x,u8 y,u8 chr)  //,u8 Char_Size
{   char i;     
     
    if(x>Max_Column-1){x=0;y=y+2;}
        OLED_Set_Pos(x,y);
      OLED_Set_Pos(x,y);  
      for(i=0;i<8;i++)
      OLED_WR_Byte(F8X16[chr*16+i],OLED_DATA);
      OLED_Set_Pos(x,y+1);
      for(i=0;i<8;i++)
      OLED_WR_Byte(F8X16[chr*16+i+8],OLED_DATA);
}    
//显示汉字 
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{      			    
	u8 t,adder=0;
	OLED_Set_Pos(x,y);	
    for(t=0;t<16;t++)
		{
				OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
		//		adder+=1;
     }	
		OLED_Set_Pos(x,y+1);	
    for(t=0;t<16;t++)
			{	
				OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
	//			adder+=1;
      }					
} 	  

void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{   
 unsigned int j=0;
 unsigned char x,y;
  
  if(y1%8==0) y=y1/8;      
  else y=y1/8+1;
  for(y=y0;y<y1;y++)
  {
    OLED_Set_Pos(x0,y);
    for(x=x0;x<x1;x++)
      {      
        OLED_WR_Byte(BMP[j++],OLED_DATA);       
      }
  }
} 
       
void OLED_Init(void)
{   
  OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  OLED_WR_Byte(0x81,OLED_CMD); // contract control
  OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap 
  OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  OLED_WR_Byte(0x00,OLED_CMD);//
  
  OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  OLED_WR_Byte(0x80,OLED_CMD);//
  
  OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  OLED_WR_Byte(0x05,OLED_CMD);//
  
  OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  OLED_WR_Byte(0xF1,OLED_CMD);//
  
  OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  OLED_WR_Byte(0x12,OLED_CMD);//
  
  OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  OLED_WR_Byte(0x30,OLED_CMD);//
  
  OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  OLED_WR_Byte(0x14,OLED_CMD);//
  
  OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
}  
  
